<?php

    /**
     * LeafPHP核心类库，负责：初始化常量、加载配置、加载语言模板、加载驱动等
     */

    class core {

        static public  $config      =  array();    //核心配置
        static private $runStatus   =  array();    //运行状态计量
        static public  $lang        =  array();    //语言模板
        static private $appInfo     =  array();    //应用信息

        /**
         * 运行核心内容
         * @access public
         */
        static public function run(){

            //检测PHP版本
            !version_compare(phpversion(), '5.2.0', '<') or die('Low PHP version,needs PHP5.2 or higher');
            self::setHeader();            //设置头信息
            self::initConst();            //常量初始化
            self::loadLang();             //加载语言配置，以实现配置的存取
            self::loadConfig();           //获取系统级配置
            self::setTimeZone();          //设置时区
            self::leafSet();              //根据PHP设置，进行LeafPHP设置
            self::initErrorHandler();     //初始化错误处理器
            self::setAutoLoad();          //设置自动加载
            self::initApp();              //检测，并初始化应用
/*            Monitor::G('begin');          //标记开始的内存和时间计量
            Monitor::G('end');            //标记结束的内存和时间计量
            self::theLastRun();            //最后运行的方法*/

        }

        /**
         * 设置utf8 header头信息
         * @access private
         */
        static private function setHeader(){

            if(!headers_sent()){
                sendHttpHeader();
            }

        }

        /**
         * 获取系统语言配置，并放入全局数组
         * 注意，该文件必须为utf-8格式，书写格式参考php.ini即可
         */
        static private function loadLang(){

            global $leaf;
            $lang_file = __LEAF_LANG_DIR__.__SP__.'lang.Cn.ini';
            file_exists_case($lang_file) ? $leafLang = @parse_ini_file($lang_file) : exit('lang.Cn.ini not exists:'.$lang_file);
            self::$lang = $leafLang;

        }

        /**
         * 常量初始化
         * @access private
         */
        static private function initConst(){
            !defined('__DIR__') && define( '__DIR__', dirname(__FILE__) );
            define( '__SP__', DIRECTORY_SEPARATOR );
            define( '__ROOT_DIR__', dirname($_SERVER['SCRIPT_FILENAME']) );
            define( '__LEAF_DIR__', __ROOT_DIR__.__SP__.'leafphp' );
            define( '__CORE_DIR__', __LEAF_DIR__.__SP__.'core' );
            define( '__DRIVER_DIR__', __LEAF_DIR__.__SP__.'driver' );
            define( '__LEAF_LANG_DIR__', __LEAF_DIR__.__SP__.'lang' );
            define( '__LEAF_CONF_DIR_', __LEAF_DIR__.__SP__.'config' );
            define( '__LEAF_FUNC_DIR__', __LEAF_DIR__.__SP__.'common' );
            define( '__LEAF_DATA_DIR__', __LEAF_DIR__.__SP__.'data' );
        }

        /**
         * 加载核心设置
         */
        static private function loadConfig(){

            $configFile = __LEAF_CONF_DIR_.__SP__.'config.php';
            file_exists_case($configFile) ? self::$config = require $configFile : exit(L('confile_not_exists'));

        }

        /**
         * 设置时区
         * @access private
         */
        static private function setTimeZone(){
            date_default_timezone_set( C('timezone') );

        }

        /**
         * 根据当前PHP配置，进行LeafPHP框架的运行处理
         * @access private
         */
        static private function leafSet(){

            //设置对魔术引用的处理和处理gpc的特殊字符
            if (!get_magic_quotes_gpc()) {
                $gpc = array($_POST,$_GET,$_COOKIE,$_REQUEST);
                foreach ($gpc as &$value) {
                    !empty($value) /*&& ($value = array_map('gpc_str_replace', $value))*/ && ($value = array_map('addslashes', $value));
                }
            }

        }


        /**
         * 获取或设置框架的核心配置
         * @access public
         * @param string $key 要获取或设置的项
         * @param string $value 要设置的配置项 default null
         */
        static public function config($key, $value=null){

            //如果是获取配置
            if( is_null($value) ){
                return isset(core::$config[$key]) ? core::$config[$key] : false;
            }
            //如果是设置配置
            else{
                core::$config[$key] = $value;
                return core::$config[$key];
            }

        }

        /**
         * 自动加载器
         * @access private
         */
        static private function setAutoLoad(){

            spl_autoload_register('self::appAutoLoad');

        }

        /**
         * 设置错误处理器
         * @access private
         */
        static private function initErrorHandler(){
            require __CORE_DIR__.__SP__.'class.error.php';
            error::init();
        }

        /**
         * App自动加载，如果是自动加载控制器、服务层等，则app常量已设定
         * @access private
         * @return void
         */
        static private  function appAutoLoad($class){

            if( $loadController = strpos($class, 'Controller') ){
                $path = CONTROLLER_PATH.__SP__.$class.'.php';
            }else{
                $path = SERVICE_PATH.__SP__.$class.'.php';
            }
            $loadReturn = load($path, 'require');
            //如果控制器不存在，手动抛出错误
            if(!$loadReturn){
                trigger_error($class.L('controller_not_exists'), E_USER_ERROR);
            }

        }

        /**
         * 应用或分组初始化并运行
         * @access private
         */
        static private function initApp(){

            require __CORE_DIR__.__SP__.'class.app.php';
            //应用初始化，主要完成应用配置检测、生成应用等
            app::init();
            //获取应用或分组的运行模式，即，要运行分组还是应用
            $runMode = app::getRunMode();
            $run = $runMode.'Run';
            //加载路由器，然后运行应用或分组
            require __CORE_DIR__.__SP__.'class.router.php';
            require __CORE_DIR__.__SP__.'class.base.php';
            require __CORE_DIR__.__SP__.'class.dao.php';
            require __DRIVER_DIR__.__SP__.'class.pdoMy.php';
            require __CORE_DIR__.__SP__.'class.controller.php';
            require __CORE_DIR__.__SP__.'class.service.php';
            app::$run();

        }

    }

?>